大家好,今天要介紹的是面試常見的問題:HashSet ~
HashSet 是一種集合。集合內的每個物件都包含 Hash (雜湊) 值,即根據數值計算出來,獨一無二的亂數,由於 HashSet 內不存放同樣雜湊值得資料,因此集合內只會有一個相同的物件(數值)。
與字典 (Dictionary) 不同的是,字典為 Key-Value Pair,但 HashSet 不存放 Key。
和字典相同的地方是:皆使用 Hash 儲存,而且都是無序 (unordered) 存放資料。
當資料量大且不需要儲存重複資料時,計算雜湊值並放入集合,會比使用迴圈尋找、放在一般的資料結構中來得更快。
以下是程式範例,可以留意存放數值 / 物件時的不同行為。
HashSetTest hashSetTest = new HashSetTest();
hashSetTest.Run();
public class HashSetTest{
protected class MyName{
string First;
string Second;
public MyName(string f, string s){
First = f;
Second = s;
}
public string Output(){
return First + ", " + Second;
}
}
HashSet<int> intHashSet;
HashSet<MyName> myNameHashSet;
public HashSetTest(){
intHashSet = new HashSet<int>();
myNameHashSet = new HashSet<MyName>();
}
public void Run(){
intHashSet.Add(1);
intHashSet.Add(2);
intHashSet.Add(3);
intHashSet.Add(2); // 重複的值不會再被加進去
foreach(int v in intHashSet){
Console.WriteLine(v.ToString());
}
MyName LeeYan = new MyName("Lee", "Yan");
myNameHashSet.Add(new MyName("Wang", "Ming"));
myNameHashSet.Add(LeeYan);
myNameHashSet.Add(new MyName("Lin", "Qin"));
myNameHashSet.Add(new MyName("Wang", "Ming")); // 不同物件 (雖然有相同的值),會被加進去
myNameHashSet.Add(LeeYan); // 相同物件不會被加進去
foreach(MyName v in myNameHashSet){
Console.WriteLine(v.Output());
}
}
}
輸出結果為:
1
2
3
Wang, Ming
Lee, Yan
Lin, Qin
Wang, Ming
參考資料:
C# hashset 如何使用 - iT 邦幫忙
c# - Define: What is a HashSet? - Stack Overflow